// 导入 path 模块
const path = require('path');
// 导入 express 模块
const express = require('express');
// 导入模块
const multer = require('multer');

// 通过调用函数获得 router 实例
const router = express.Router();

// 指定文件上传路径(可以根据实际需要指定为任意位置)
const dest = path.resolve( __dirname , '../uploads');
// const upload = multer( { dest: dest } );

// 指定磁盘存储引擎的配置
const options = {
    // 确定存储路径
    destination: function (req, file, handler) {
        handler(null, dest );
    },
    // 生成文件名(即保存在服务器上的文件名)
    filename: function (req, file, handler) {
        // 获得由用户上传的原始文件名
        let original = file.originalname;

        let prefix = original;
        // 获得 小圆点 最后一次出现的位置
        let index = prefix.lastIndexOf( '.' ) ;
        if( index != -1 ) {
            prefix = prefix.substring( 0 , index );
        }

        // 获得文件扩展名
        let suffix = path.extname( original );
        // 将 前缀 时间 后缀 连接在一起形成新文件名称
        let filename = prefix + '-' + Date.now() + suffix ;
        
        handler(null, filename );
    }
}
// 创建磁盘存储引擎
const storage = multer.diskStorage( options );
// 创建 multer 实例
const upload = multer( { storage: storage  } );


// 不论什么请求方式，只要请求路径匹配，都可以调用第二个参数表示的函数
router.all('/explore/request',(req,resp)=>{
    // 获得请求方式(即HTTP动作)
    let method = req.method;
    // 获得请求路径
    let url = req.url;
    // 获得协议和版本
    let protocol = req.protocol + "/" + req.httpVersion ;
    console.log( '请求首行( request line ):' );
    console.log( method ,'\t', url ,'\t' , protocol );
    
    let headers = req.headers;
    console.log( '请求头( request headers ):' );
    // console.log( headers );
    for( let name in headers ){
        let value = headers[ name ];
        console.log( name , ':' , value );
    }

    console.log( '请求体( request body ):' );
    console.log( req.body );

    resp.send(`<a href="/index.html">返回首页</a>`);
});

// 调用 upload 的 none 返回一个中间件
const first = upload.none();
console.log( 'first: ' , first );

// 自定义中间件
const second = (req,resp,next) => {
    console.log( req.body );
    next(); // 调用下一个中间件
}
console.log( 'second: ' , second );

// 自定义中间件
const third = (req,resp,next) => {
    resp.send(`<a href="/index.html">返回首页</a>`);
}
console.log( 'third: ' , third );

// 当用 POST 方式访问 `/explore/multi` 时，就会依次调用 first 、second 、third 中间件
router.post('/explore/multi', first , second , third );

// <input type="file" name="upfile">
const singleFileHandler = upload.single( 'upfile' );

const mySingleHandler = (req,resp) => {

    // 在经过 singleFileHandler 处理后，req.file 就表示用户上传的文件
    // req.file is the `upfile` file
    console.log( req.file );
    // 如果表单中还有其它的 multipart/form-data 数据(文本数据)，则将其保留在 req.body 中
    // req.body will hold the text fields, if there were any
    console.log( req.body );

    resp.send(`<p>上传成功!<a href="/index.html">返回首页</a></p>`);
}

router.post('/explore/upload/single', singleFileHandler , mySingleHandler );

// 处理多个 `<input type="file" name="up">` 中包含的文件
const fileArrayHandler = upload.array( 'up' , 3 );

const myFilesHandler = (req,resp) => {
    // req.files 是 `up` 文件数组的信息
    req.files.forEach( f => console.log( f.filename ) );
    // req.body 将具有文本域数据，如果存在的话
    resp.send(`<p>上传成功!<a href="/index.html">返回首页</a></p>`);
}

router.post('/explore/upload/array', fileArrayHandler, myFilesHandler );


// 处理不同的 `<input type="file">` 中所包含的文件
const fieldsHandler = upload.fields([ 
    { name: 'photo' , maxCount: 1 } , 
    { name: 'plainText' , maxCount: 1 } 
]);

router.post('/explore/upload/fields',fieldsHandler,(req,resp)=>{
    // req.files 是一个对象 (String -> Array)，其中 键 是 fieldname ，值是文件数组
    console.log( req.files );
    resp.send(`<p>上传成功!<a href="/index.html">返回首页</a></p>`);
});

// 导出 router 对象
module.exports = router;